import cv2
import numpy as np
import os
import sys
import subprocess
import tempfile


def encode(input_bin_file, output_video_file, duration_ms):
    # 读取二进制文件
    with open(input_bin_file, "rb") as f:
        binary_data = f.read()

    # 设置图像的相关参数
    frame_width = 100  # 图像宽度
    frame_height = 100  # 图像高度
    frame_size = frame_width * frame_height  # 每帧需要的像素数
    frame_rate = 30  # 帧率，每秒30帧

    # 计算需要的帧数
    num_frames = int(frame_rate * (duration_ms / 1000))  # 总帧数

    # 临时目录用于存储生成的图像帧
    temp_dir = tempfile.mkdtemp()

    # 生成图像帧
    for i in range(num_frames):
        # 创建一个100x100的灰度图像
        frame = np.zeros((frame_height, frame_width), dtype=np.uint8)

        # 每帧需要frame_size个字节数据（100x100的图像）
        for y in range(frame_height):
            for x in range(frame_width):
                byte_index = (i * frame_size + y * frame_width + x) % len(binary_data)
                byte_value = binary_data[byte_index]

                # 设置像素的灰度值
                frame[y, x] = byte_value

        # 保存图像帧为png文件
        frame_filename = os.path.join(temp_dir, f"frame_{i:04d}.png")
        cv2.imwrite(frame_filename, frame)

    # 使用 FFmpeg 将图像帧转换为视频
    ffmpeg_cmd = [
        'ffmpeg',
        '-y',  # 覆盖输出文件
        '-framerate', str(frame_rate),  # 设置帧率
        '-i', os.path.join(temp_dir, 'frame_%04d.png'),  # 输入图像帧
        '-c:v', 'libx264',  # 使用 H.264 编码
        '-pix_fmt', 'yuv420p',  # 设置像素格式为YUV420P，兼容性更好
        output_video_file  # 输出视频文件
    ]

    # 执行 FFmpeg 命令
    subprocess.run(ffmpeg_cmd, check=True)

    # 删除临时文件夹中的帧文件
    for file in os.listdir(temp_dir):
        os.remove(os.path.join(temp_dir, file))
    os.rmdir(temp_dir)

    # 使用macOS的open命令自动播放生成的视频
    subprocess.run(['open', output_video_file], check=True)

    print(f"视频编码完成并播放：{output_video_file}")


if __name__ == "__main__":
    if len(sys.argv) != 4:
        print("Usage: python encode.py <input_bin_file> <output_video_file> <duration_ms>")
        sys.exit(1)

    input_bin_file = sys.argv[1]
    output_video_file = sys.argv[2]
    duration_ms = int(sys.argv[3])

    encode(input_bin_file, output_video_file, duration_ms)
